home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
081-090
/
amok82
/
plot
/
source
/
formelauswertung.def
< prev
next >
Wrap
Text File
|
1993-11-04
|
6KB
|
121 lines
DEFINITION MODULE Formelauswertung;
(*
Created: 30.8.87
Changed: 12.02.88/29.8.88/1.10.88 by
Stefan Salewski
Stolper Weg 3
2160 Stade West-Germany
Tel: 04141/61130
Note: compiled with AMIGA Modula-2 System by AMSoft from 5.5.88
This Module may be freely copied. But please
leave my name in. Thanks....Stefan
Berechnung von Formeln in Form von Strings
------------------------------------------
Dieses Modul macht es möglich, Programme zu schreiben, die
beliebige mathematische Formeln in Form eines Strings einlesen,
die Formel überprüfen und dann beliebig oft berechnen. Damit
wird ein Nachteil, den Modula gegenüber Interpreter-Sprachen wie
Basic hat, aufgehoben.
Benutzung dieses Moduls:
Zuerst liest man die mathematische Formel in Form eines Strings ein,
dieser String muß vom Typ Formelstring sein.
Danach muß mit AssignLong oder AssignFFP allen Variablen, die in der
Formel vorkommen, ein (vorläufiger) Wert zugewiesen werden.
Dann wird DefFormel mit diesem String und einer beliebigen Formelnummer
zwischen 1 und 10 aufgerufen. Ist der String ein korrekter mathematischer
Ausdruck, wie er z.B. auch von R.o.M. verwendet wird, (z.B. 'sin(3.5*x)'
oder '34/34.55+12.34E-123*sinh(12.7-2.12)-12.34^34') so ist die Fehlernummer
gleich Null. Nun können die Variablen mit AssignFFP oder AssignLong
beliebig geändert werden, und die Formel kann mit Longberechnung oder
FFPBerechnung beliebig oft berechnet werden.
Sowohl DefFormel als auch FFPBerechnung und LongBerechnung liefern
bei Fehlern Fehlernummern. Diese Fehlernummer sollte nach jeder
Berechnung abgefragt werden. Ist sie ungleich Null, so kann man mit
dem Modul FormelausFText die Ursache des Fehlers in Form eines Textes
erfahren.
Die Geschwindigkeit der Berechnung ist, wie man an R.o.M. sieht, recht
hoch. FFPBerechnung braucht zur Berechnung einer Formel ungefähr
doppelt so lange wie es dauern würde, die selbe Formel in compilierter
Form zu berechnen. Bei LongBerechnung wird dagegen kaum ein Unterschied
zu der compilierten Formel bemerkbar sein, da die Zeit, die für die
Interpretation der Formel benötigt wird, sehr klein gegenüber der
Zeit, die LongReal-Berechnungen in Anspruch nehmen, ist.
Eine Procedure RealBerechnung existiert momentan nicht, der Grund
dafür ist, daß Bereichsüberschreitungen bei arithmetischen
Operationen zwischen REAL-Zahlen keine definierten Resultate ergeben.
Also kann ich diese Überläufe nicht sicher festelllen und daher
nicht für die Korrektheit des Ergebnisses garantieren.
Formeln mit verschiedener Formelnummer können unabhängig voneinander
benutzt werden. Man kann also mehrere Formeln definieren und dann
abwechselnd berechnen lassen. Formelnummer 0 nicht verwenden, sie wird
intern benutzt.
*)
FROM SYSTEM IMPORT FFP;
CONST
StrLength=255; (* so groß dürfen die zu berechnenden Ausdrücke sein *)
AnzahlFormeln=10;(* Zahl der Formeln die gleichzeitig benutzt werden *)
(* können, Nummer 0 nicht verwenden *)
TYPE
Formelnummer=[0..AnzahlFormeln];
Formelstring=ARRAY[0..StrLength] OF CHAR;
(* Formelnummer 0 nicht benutzen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
VAR
(* Achtung: Normalerweise sollte die Definition von Variablen über
AssignLong und AssignFFP erfolgen. Wenn es sehr auf die Geschwindigkeit
ankommt, können auch vorsichtig direkt an varListLong und varListFFP
Werte zugewiesen werden.
Ok:=AssignFFP('x',23.456) entspricht varListFFP['x']:=23.456
*)
varListLong:ARRAY['A'..'z'] OF LONGREAL;
varListFFP:ARRAY['A'..'z'] OF FFP;
PROCEDURE AssignLong(c:CHAR;x:LONGREAL):BOOLEAN;
(* Weist der Variablen c den Wert x zu *)
(* c ist Buchstabe => TRUE *)
PROCEDURE AssignFFP(c:CHAR;x:FFP):BOOLEAN;
(* Weist der Variablen c den Wert x zu *)
(* c ist Buchstabe => TRUE *)
PROCEDURE ClearVar(c:CHAR);
(* Variable c gilt als undefiniert und kann nicht mehr in Formeln
benutzt werden *)
PROCEDURE GetLongValue(c:CHAR;VAR x:LONGREAL):BOOLEAN;
(* TRUE wenn dem Buchstaben c bereits ein Wert zugewiesen wurde *)
PROCEDURE GetFFPValue(c:CHAR;VAR x:FFP):BOOLEAN;
(* TRUE wenn dem Buchstaben c bereits ein Wert zugewiesen wurde *)
PROCEDURE DefFormel(nummer:Formelnummer;VAR str:ARRAY OF CHAR;
korrekt,onlyLong:BOOLEAN):CARDINAL;
(* Definiert eine neue Formel.Ist korrekt=TRUE, so ist 4+3*8= 28 sonst 56 *)
(*str wird nicht verändert,bei Fehler bleibt die alte Formel unverändert *)
(*Ist onlyLong=TRUE, so können in der Formel auch Zahlen > 1.0E18 vor- *)
(*kommen, dann darf aber nicht FFPBerechnung benutzt werden *)
(* Fehlernummern: *)
(* 0:Kein Fehler *)
(* 31:Formel ist leer *)
(* 32:nicht alle Variablen sind initialisiert(mit Assign...) *)
(* 33:Syntaxfehler *)
(* 34:Formel enthält ungültiges Zeichen *)
(* 35:Formel enthält zu große Zahlen *)
PROCEDURE FFPBerechnung(nummer:Formelnummer;VAR ergebnis:FFP;
VAR fehlernummer:CARDINAL);
PROCEDURE LongBerechnung(nummer:Formelnummer;VAR ergebnis:LONGREAL;
VAR fehlernummer:CARDINAL);
(* Kein Fehler bei Berechnung => Fehlernummer=0 *)
END Formelauswertung.def